/**
 * Copyright 2010 - YangJiandong(chunquedong)
 * 
 * This file is part of ChunMap project
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE(Version >=3)
 * 
 * ChunMap是开源软件。你可以自由复制、传播本项目的下载包文件，但必须保持其完整性。
 * 我们不用对使用中的风险及由此造成的损失承担任何责任。
 * 详细情况请见《ChunMap许可协议》。
 * 
 * 想了解更多有关ChunMap的信息，请访问http://code.google.com/p/chunmap/
 * 
 * 下面此段程序作者YangJianDong(chunquedong)
 * 最后修改时间2010.7.17
 */
package chunmap.model.crs.proj;

import chunmap.data.feature.Feature;
import chunmap.data.feature.ShapeFeature;
import chunmap.data.feature.VisitAction;
import chunmap.model.crs.CoordinateRSystem;
import chunmap.model.crs.transf.TransformChain;
import chunmap.model.geom.Geometry;

public class ReProjection implements VisitAction {

	private TransformChain trans=null;

	public ReProjection(CoordinateRSystem target, CoordinateRSystem source) {
		boolean sourceOk = (source != null && source.getProjection() != null);
		boolean targetOk = (target != null && target.getProjection() != null);

        if (!sourceOk && !targetOk)
        {
            return;
        }
        if (sourceOk && targetOk)
        {
            if (source.getProjection().getName().equals(target.getProjection().getName()))
                return;
        }

        //OK! go on

        trans = new TransformChain();

        if (sourceOk)
        {
            trans.add(source.getProjection().getReverseTransform());
        }
        if (targetOk)
        {
           trans.add(target.getProjection().getTransform());
        }
	}

	@Override
	public void execute(Feature obj) {
		if (trans == null) return;
		if (obj instanceof ShapeFeature) {
			ShapeFeature shape = (ShapeFeature) obj;
			Geometry g = (shape.getGeometry());
			if (g == null)
				return;
			Geometry ng = g.transform(trans);
			shape.setGeometry(ng);
		}
	}
}
